package demo10

// 装饰器设计模式
// 在不修改原代码的基础上新增功能

// 定义规则 计算器
// 分析计算器 
// 可以做加减乘除运算
// 中间都有运算该方法，那么是否可以装饰该方法,
// 装饰器又类似OOP的继承那么实现如下
type Component interface{
	Calc() int
}

type ConcreateComponent struct{}

// 运算的方法
func (c *ConcreateComponent)Calc() int{
	return 0
}

type MulDecorator struct{
	Component
	num int
}
// 乘
func WarpMulDecorator(c Component, num int) *MulDecorator{
	return &MulDecorator{
		Component:c,
		num:num,
	}
}

func (m *MulDecorator)Calc() int{
	return m.Component.Calc() * m.num
}

// 加
type AddDecorator struct{
	Component
	num  int
}

func WarpAddDecorator(c Component,num int) *AddDecorator{
	return &AddDecorator{
		Component:c,
		num:num,
	}
}

func (a *AddDecorator)Calc() int{ 
	return a.Component.Calc() + a.num
}